package vip.liux.backend.application.service.pay;


import vip.liux.application.dots.ListResultDto;
import vip.liux.backend.application.service.pay.dto.channel.PayChannelCreateDto;
import vip.liux.backend.application.service.pay.dto.channel.PayChannelDto;
import vip.liux.backend.application.service.pay.dto.channel.PayChannelUpdateDto;
import vip.liux.contracts.infrastructure.pay.PayClient;
import vip.liux.core.exception.BusinessException;

import java.util.Collection;

/**
 * 支付渠道 Service 接口
 *
 * @author aquan
 */
public interface PayChannelService {

    /**
     * 创建支付渠道
     *
     * @param createDto 创建信息
     * @return 编号
     */
    PayChannelDto createChannel(PayChannelCreateDto createDto);

    /**
     * 更新支付渠道
     *
     * @param id          id
     * @param updateDto 更新信息
     */
    PayChannelDto updateChannel(Long id, PayChannelUpdateDto updateDto);

    /**
     * 删除支付渠道
     *
     * @param id 编号
     */
    void deleteChannel(Long id);

    /**
     * 获得支付渠道
     *
     * @param id 编号
     * @return 支付渠道
     */
    PayChannelDto getChannel(Long id);

    /**
     * 根据支付应用 ID 集合，获得支付渠道列表
     *
     * @param appIds 应用编号集合
     * @return 支付渠道列表
     */
    ListResultDto<PayChannelDto> getChannelListByAppIds(Collection<Long> appIds);

    /**
     * 根据条件获取渠道
     *
     * @param appId 应用编号
     * @param code  渠道编码
     * @return 数量
     */
    PayChannelDto getChannelByAppIdAndCode(Long appId, String code);

    /**
     * 支付渠道的合法性
     * <p>
     * 如果不合法，抛出 {@link BusinessException} 业务异常
     *
     * @param id 渠道编号
     * @return 渠道信息
     */
    PayChannelDto validPayChannel(Long id);

    /**
     * 支付渠道的合法性
     * <p>
     * 如果不合法，抛出 {@link BusinessException} 业务异常
     *
     * @param appId 应用编号
     * @param code  支付渠道
     * @return 渠道信息
     */
    PayChannelDto validPayChannel(Long appId, String code);

    /**
     * 获得指定应用的开启的渠道列表
     *
     * @param appId 应用编号
     * @return 渠道列表
     */
    ListResultDto<PayChannelDto> getEnableChannelList(Long appId);

    /**
     * 获得指定编号的支付客户端
     *
     * @param id 编号
     * @return 支付客户端
     */
    PayClient<?> getPayClient(Long id);
}
